# 演示: 原函数是有参无参,有返回值无返回值, 装饰器的内部函数和原函数保持一致
# 不同的源函数有不同的装饰方式, 根据原函数有5种装饰方式, 影响闭包的内部函数
# 1 定义装饰器
# 2 装饰原函数
# 3 调用装饰器

# 1有嵌套 内部函数外外部函数
def print_info(func):

    def inner():
        # 4有添加额外功能
        print('正在努力计算')
        # 2有引用
        func()

    # 3有返回
    return inner

@print_info
def get_sum():
    a = 10
    b = 20
    c = a + b
    print('两数之和:', c)


def dm01_无参无返回值():
    get_sum()
    pass


# 2 ---------------------------------------------
def print_info2(func):
    def inner(a, b):
        # 4有添加额外功能
        print('正在努力计算')
        # 2有引用
        func(a, b)

    # 3有返回
    return inner

@print_info2
def get_sum2(a, b):
    c = a + b
    print('两数之和:', c)


def dm02_有参无返回值():
    get_sum2(20, 21)
    pass

# 3 ---------------------------------------------
# 1 有嵌套
def print_info3(func):
    def inner():
        # 4 有添加额外功能
        print('正在努力计算')
        # 2有引用
        return func()

    # 3 有返回
    return inner

# 一旦写生这个相当于: get_sum3 = print_info3(get_sum3)
@print_info3
def get_sum3():
    a = 31
    b = 32
    c = a + b
    print('两数之和:', c)
    return c

def dm03_无参有返回值():
    get_sum3()


# 4 ---------------------------------------------
def print_info4(func):
    def inner(a, b):
        print('正在努力的计算....')
        return func(a, b)
    return inner

@print_info4  # get_sum4 = print_info4(get_sum4)
def get_sum4(a, b):
    c = a + b
    print('两数之和:', c)
    return c

if __name__ == '__main__':
    # dm01_无参无返回值()
    # dm02_有参无返回值()
    # dm03_无参有返回值()

    # 有参数有返回值
    result = get_sum4(41, 42)
    print('result-->', result)
    pass
